#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "mytbf.h"

#define CPS 	10
#define BUFSIZE 1024
#define BURST 	100

/*
 * 全局变量
 */
static volatile int token = 0;
/*
 * 主函数
 */
int main(int argc, char * argv[])
{
	//定义变量
	int sfd, dfd = 1;
	char buf[BUFSIZE];
	mytbf_t * tbf;
	int len;
	int ret;
	int pos;
	int size;
	//参数检验
	if(argc < 2)
	{
		fprintf(stderr, "err\n");
		exit(1);
	}
	//初始化令牌桶
	tbf = mytbf_init(CPS, BURST);
	if(tbf == NULL)
	{
		fprintf(stderr, "mytbf_init failed\n");
		exit(1);
	}
	//打开文件
	do
	{
		sfd = open(argv[1], O_RDONLY);
		if(sfd < 0)
		{
			if(errno != EINTR)
			{
				fprintf(stderr, "err\n");
				exit(1);
			}
		}
	}while(sfd < 0);
	//读文件 输出内容
	while(1)
	{
		//花费令牌
		size = mytbf_fetchtoken(tbf, BUFSIZE);
		if(size < 0)
		{
			fprintf(stderr,"mytbf_fetchtken:%s\n", strerror(-size));
			exit(0);
		}
		//读文件
		while((len = read(sfd, buf, size)) < 0)
		{
			if(errno == EINTR)
				continue;
			perror("read");
			break;//bugbug
		}
		if(len == 0)
		{
			break;
		}

		if(size - len > 0)
		{
			mytbf_returntoken(tbf, size - len);
		}
		//写文件
		pos = 0;
		while(len > 0)
		{
			ret = write(dfd, buf + pos, len);
			if(ret < 0)
			{
				if(errno == EINTR)
					continue;
				perror("write");
				exit(1);
			}
			pos += ret;
			len -= ret;
		}
	}

	close(sfd);
	mytbf_destroy(tbf);

	exit(1);
}
